Les étiquettes sont énormément utilisées par Gtk2Hs et sont relativement simples. Les étiquettes n'émettent pas de signaux. Si vous avez besoin de capturer un signal, placez l'étiquette à l'intérieur d'un widget EventBox (ils permettent de capturer des signaux pour des widgets qui n'ont pas leur propre fenêtre).
Pour créer une étiquette, utilisez:
labelNew :: Maybe String -> IO Label
labelNewWithMnemonic :: String -> IO Label
Avec la seconde fonction, si un caractère est précédé d'un underscore (tiret bas), il est souligné. Si vous avez besoin d'afficher le caractère underscore dans une étiquette, utilisez __
(deux underscores à la suite). Le premier caractère représente un raccourci clavier appelé mnémonique. Quand cette touche est pressée, le widget activable qui contient l'étiquette (par exemple, un bouton) sera activé. Le mnémonique peut également être affecté à un widget avec labelSetMnemonicWidget.
Pour changer le texte du label après sa création ou pour obtenir le texte de l'étiquette, utilisez les fonctions:
labelSetText :: LabelClass self => self -> String -> IO ()
labelGetLabel :: LabelClass self => self -> IO String
Ou alors les fonctions génériques set ou get. L'espace nécessaire à la nouvelle chaîne de caractères sera automatiquement ajusté au besoin. Vous pouvez écrire des étiquettes multi-lignes en plaçant des sauts de ligne dans la chaîne de caractères. Si vous avez des chaînes multi-lignes, les lignes peuvent être justifiées en utilisant:
labelSetJustify :: LabelClass self => self -> Justification -> IO ()
Ou le type Justification reçoit un des constructeurs suivant:
JustifyLeft
JustifyRight
JustifyCenter
JustifyFill
Le widget label est aussi capable de faire des retours à la ligne automatiques. Cela peut être activé avec:
labelSetLineWrap :: LabelClass self => self -> Bool -> IO ()
Si vous voulez que votre étiquette soit soulignée, alors vous pouvez définir un motif pour l'étiquette:
labelSetPattern :: LabelClass self => self -> [Int] -> IO ()
La liste de Int marque les parties soulignées du texte, alternées par les parties non-soulignées. Par exemple, [3, 1, 3] signifie que les trois premiers caractères seront soulignés, le suivant non et les trois autres suivants oui.
Vous pouvez également rendre le texte d'une étiquette sélectionnable, l'utilisateur pourra alors le copier et le coller et utiliser des options de formatage.
En dessous, un petit exemple pour illustrer certaines de ces fonctions. Il utilise le widget Frame pour montrer les styles des étiquettes. Un widget Frame est juste une décoration comme un HSeparator et un VSeparator mais il entoure le widget et est une instance de Container. Le widget encadré doit donc être ajouté avec containerAdd. Un cadre peut lui-même contenir une étiquette pour fournir des informations sur son contenu.
Pour que toutes les étiquettes soient encadrées, on crée une fonction myLabelWithFrameNew pour retourner l'étiquette et son cadre dans un "tuple". Gtk2Hs est vraiment dans le style de Haskell, vous pouvez utiliser tous les types de données et fonctionnalités. Justifier du texte est assez évident mais cela s'applique uniquement aux lignes à l'intérieur de l'étiquette. Pour justifier à droite label2, vous avez besoin de miscSetAlignment comme montré en dessous. Les deux derniers widgets dans la boite horizontale à gauche sont empaquetés avec boxPackEnd au lieu de l'habituel boxPackStart. L'étiquette du bouton montre l'utilisation d'un mnémonique comme raccourci clavier. Appuyer sur Alt-C au clavier a le même effet que de cliquer sur le bouton.
import Graphics.UI.Gtk
main:: IO ()
main = do
initGUI
window <- windowNew
set window [windowTitle := "Labels", containerBorderWidth := 10]
mainbox <- vBoxNew False 10
containerAdd window mainbox
hbox <- hBoxNew True 5
boxPackStart mainbox hbox PackNatural 0
vbox1 <- vBoxNew False 10
vbox2 <- vBoxNew False 0
boxPackStart hbox vbox1 PackNatural 0
boxPackStart hbox vbox2 PackNatural 0
(label1,frame1) <- myLabelWithFrameNew
boxPackStart vbox1 frame1 PackNatural 0
labelSetText label1 "Penny Harter"
(label2,frame2) <- myLabelWithFrameNew
boxPackStart vbox1 frame2 PackNatural 0
labelSetText label2 "broken bowl\nthe pieces\nstill rocking"
miscSetAlignment label2 0.0 0.0
hsep1 <- hSeparatorNew
boxPackStart vbox1 hsep1 PackNatural 10
(label3,frame3) <- myLabelWithFrameNew
boxPackStart vbox1 frame3 PackNatural 0
labelSetText label3 "Gary Snyder"
(label4,frame4) <- myLabelWithFrameNew
boxPackStart vbox1 frame4 PackNatural 0
labelSetText label4 "After weeks of watching the roof leak\nI fixed it tonight\nby moving a single board"
labelSetJustify label4 JustifyCenter
(label5,frame5) <- myLabelWithFrameNew
boxPackStart vbox2 frame5 PackNatural 0
labelSetText label5 "Kobayashi Issa"
(label7,frame7) <- myLabelWithFrameNew
boxPackEnd vbox2 frame7 PackNatural 0
labelSetText label7 "only one guy and\nonly one fly trying to\nmake the guest room do"
labelSetJustify label7 JustifyRight
(label6,frame6) <- myLabelWithFrameNew
boxPackEnd vbox2 frame6 PackNatural 10
labelSetText label6 "One Guy"
frameSetLabel frame6 "Title:"
labelSetPattern label6 [3, 1, 3]
button <- buttonNew
boxPackEnd mainbox button PackNatural 20
buttonlabel <- labelNewWithMnemonic "Haiku _Clicked"
containerAdd button buttonlabel
widgetShowAll window
onClicked button (putStrLn "button clicked...")
onDestroy window mainQuit
mainGUI
myLabelWithFrameNew :: IO (Label,Frame)
myLabelWithFrameNew = do
label <- labelNew Nothing
frame <- frameNew
containerAdd frame label
frameSetShadowType frame ShadowOut
return (label, frame)
-- Haikus quoted from X.J. Kennedy, Dana Gioia, Introduction to Poetry, Longman, 1997